package Recursion.Maze;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: ws
 * Date: 2022-12-02
 * Time: 21:50
 */
public class Maze {
    /**
     * 迷宫规则：
     * 1.先创建迷宫，用二维数组int[] map = new int[8][7];
     * 2.先规定map数组的元素值：0表示可以走 1表示障碍物 3表示走过该路径
     */
    private final int row = 8;
    private final int col = 7;
    private final int[][] map = new int[row][col];
    public void Create() {
        //将最上面的一行和最下面的一行设置为1
        for (int i = 0; i < map[0].length; i++) {
            this.map[0][i] = 1;
            this.map[map.length - 1][i] = 1;
        }
        //将最左面的一行和最右面的一行设置为1
        for (int i = 0; i < map.length; i++) {
            this.map[i][0] = 1;
            this.map[i][map[0].length - 1] = 1;
        }
    }
    public void Barrier(int row,int col) throws CheckException {
        CheckCol(col);
        CheckRow(row);
        this.map[row][col] = 1;
    }
    public void CheckRow(int row) throws CheckException {
        if (row < 0 || row > this.map.length - 2) {
            throw new CheckException("Row不合法");
        }
    }
    public void CheckCol(int col) throws CheckException {
        if (col < 0 || col > this.map[0].length - 2) {
            throw new CheckException("Col不合法");
        }
    }

    /**
     * 1. FindWay方法就是专门找出迷宫路径的
     * 2. 找到返回 true，否则返回 false
     * 3. map 为迷宫
     * 4. （i，j）为老鼠的初始位置
     * 5. 0 表示可以走，1 为障碍物， 2表示可以走， 3 表示走过，但走不通
     * 6. 设置值终点为 map[6][5] == 2 ，说明找到通路
     * 7. 找路策略 下-右-上-左
     */
    public boolean FindWay(int row, int col) {
        if (map[6][5] == 2){
            return true;
        }else {
            if (map[row][col] == 0) {
                //假定可以走通
                map[row][col] = 2;
                //开始找路
                //下
                if (FindWay(row+1, col)){
                    return true;
                //右
                }else if (FindWay(row, col+1)){
                    return true;
                //上
                }else if (FindWay(row-1, col)){
                    return true;
                //左
                }else if (FindWay(row, col-1)){
                    return true;
                //此路不通
                }else {
                    map[row][col] = 3;
                    return false;
                }
            }else {
                return false;
            }
        }
    }
    public void Show() {
        System.out.println("==当前地图情况==");
        for (int[] ints : this.map) {
            for (int anInt : ints) {
                System.out.print(anInt + " ");
            }
            System.out.println();
        }
    }
}
